#pragma once
#include "connection.hpp"
using func_t = std::function<std::string(std::string &)>;
class io_service : public connection
{
public:
    io_service(int fd = -1)
        : connection(fd)
    {
        set_fd(fd);
        set_events(EPOLLIN | EPOLLET);
    }


    virtual void receiver() override
    {
        // 接收数据的逻辑
        while (true)
        {
            char buffer[1024];
            ssize_t read_size = recv(fd(), buffer, sizeof(buffer) - 1, 0);
            if (read_size > 0)
            {
                buffer[read_size] = '\0'; // 确保字符串以null结尾
                append_inbuffer(buffer);
                continue;
            }
            else if (read_size == 0)
            {
                // 对端关闭连接
                excepter();
                return;
            }
            else
            {
                if (errno == EAGAIN || errno == EWOULDBLOCK)
                {
                    break; // 没有更多数据可读
                }
                else if(errno == EINTR)
                {
                    continue; // 被信号打断，继续读取
                }
                else
                {
                    excepter(); // 发生错误，处理异常
                    return;
                }
            }
        }
        //确定已经读完，要对读取的数据进行处理
        //为了确定读取的数据有几段报文，协议
        std::string result;
        if(_on_message)
            result = _on_message(inbuffer());
        append_outbuffer(result);
        //把结果写回
        if (!outbuffer().empty())
        {
            //策略一：直接调用sender
            //sender();
            //策略二：使能写事件
            owner()->enable_read_write(fd(), true, true);
        }
        
    }
    virtual void sender() override
    {
        // 处理发送数据的逻辑
        while(true)
        {
            ssize_t write_size = send(fd(), outbuffer().c_str(), outbuffer().size(), 0);
            if(write_size > 0)
            {
                // 将outbuffer中write_size字节的数据删除
                discard_outstring(write_size);
            }
            //已经无数据写
            else if(write_size == 0)
            {
                break;
            }
            else
            {
                if(errno == EAGAIN || errno == EWOULDBLOCK)
                {
                    break; // 系统缓冲区已被写满
                }
                else if(errno == EINTR)
                {
                    continue; // 被信号打断，继续写入
                }
                else
                {
                    excepter(); // 发生错误，处理异常
                    return;
                }
            }
        }
        //已经没有数据需要再写入
        if(outbuffer().empty())
        {
            //禁用写事件
            owner()->enable_read_write(fd(), true, false);
        }
        //或系统缓冲区满
        else
        {
            //继续使能写事件
            owner()->enable_read_write(fd(), true, true);
        }
    }
    virtual void excepter() override
    {
        // 处理异常的逻辑
        LOG(LogLevel::INFO) << "客户端连接可能结束，进行异常处理: " << fd();
        owner()->del_connection(fd());
    }
    void RegisterOnMessage(func_t on_message)
    {
        _on_message = on_message;
    }

private:
    func_t _on_message;
};